package middlewares

import (
	"fmt"
	"gitee.com/lv_baobao/gcore/logHelper"
	"gitee.com/lv_baobao/gcore/redisClient"
	"sync"
	"time"
)

type UserTokenCache struct {
	client redisClient.IRedisClient
}

var userTokenCache *UserTokenCache
var userTokenCacheOnce sync.Once

func NewUserTokenCache() *UserTokenCache {
	userTokenCacheOnce.Do(func() {
		userTokenCache = &UserTokenCache{}
		userTokenCache.client = redisClient.NewRedisClient()
	})
	return userTokenCache
}

func (u *UserTokenCache) getKey(token string) string {
	return fmt.Sprintf("User:UserToken:%s", token)
}

func (u *UserTokenCache) GetTokenInfo(token string) *UserSessionLoginInfo {
	key := u.getKey(token)
	var pro = &UserSessionLoginInfo{}
	err := u.client.Get(key, pro)
	if err != nil {
		if err.Error() != "redis: nil" {
			logHelper.Error(err)
		}
		return nil
	}
	return pro
}

func (u *UserTokenCache) AddTokenInfo(token string, tokenInfo UserSessionLoginInfo) bool {
	key := u.getKey(token)
	err := u.client.Add(key, tokenInfo, time.Hour*24)
	if err != nil {
		logHelper.Error(err)
	}
	return err != nil
}

func (u *UserTokenCache) Refresh(token string) bool {
	key := u.getKey(token)
	err := u.client.Expire(key, time.Hour*24)
	return err != nil
}

func (u *UserTokenCache) RemoveTokenInfo(token string) bool {
	key := u.getKey(token)
	err := u.client.Del(key)
	return err != nil
}
